package cn.com.baiwei.service.impl;

import cn.com.baiwei.mapper.IntegralExchangeMapper;
import cn.com.baiwei.mapper.IntegralExchangeParticularsMapper;
import cn.com.baiwei.mapper.MerchandiseMapper;
import cn.com.baiwei.mapper.VipMapper;
import cn.com.baiwei.pojo.IntegralExchange;
import cn.com.baiwei.pojo.IntegralExchangeParticulars;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * (IntegralExchange)表服务实现类
 *
 * @author X_Q
 * @since 2021-09-15 14:54:41
 * @version 1.0
 */
@Service("integralExchangeService")
public class IntegralExchangeServiceImpl {
    @Resource
    private IntegralExchangeMapper integralExchangeMapper;

    @Resource
    private IntegralExchangeParticularsMapper integralExchangeParticularsMapper;

    @Resource
    private VipMapper vipMapper;

    @Resource
    private MerchandiseMapper merchandiseMapper;

    /**
     * 根据模糊条件查询总个数
     *
     * @param id 查询条件
     * @return 返回查询到的总个数
     */
    public Map<String, Object> selectForCount(String id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.integralExchangeMapper.selectForCount(id));
        return map;
    }

    /**
     * 查询所有数据
     * @return  返回所有数据
     */
    public Map<String, Object> selectAll() {
        Map<String, Object> map = new HashMap<>();
        List<IntegralExchange> integralExchanges = integralExchangeMapper.selectAll();
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data",integralExchanges);
        return map;
    }

    /**
     * 通过订单ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public Map<String, Object> selectByOrderId(Integer id) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", id+"订单查询成功");
        map.put("data",this.integralExchangeParticularsMapper.selectByOrderId(id));
        return map;
    }

    /**
     * 根据手机号查询多条订单
     * @param vipPhone 会员手机号
     * @return
     */
    public Map<String, Object> selectByPhone(String vipPhone) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data",this.integralExchangeMapper.selectByPhone(vipPhone));
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param index 查询起始位置
     * @param id  订单编号查询
     * @return 对象列表
     */
 /*   public Map<String, Object> selectForPage(int index, String id) {
    // 获取当前表中的总记录
        int tableCount = this.integralExchangeMapper.selectForCount(id);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / 10 + 1;
        // 计算每页开始的下标值
        index = (index - 1) * 10;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.integralExchangeMapper.selectForPage(index, id));
        return map;
    }*/

    /**
     * 生成订单 订单/订单详情
     *
     * @param integralExchange 实例对象
     * @return 实例对象
     */
    @Transactional
    public Map<String, Object> insert(IntegralExchange integralExchange) { // List<1,2,3,list<integralExchangeParticulars>>
        Map<String, Object> map = new HashMap<>();
        Integer sum = integralExchange.getIntegralSum();
        String vipPhone = integralExchange.getVipPhone();
        if(vipMapper.selectForIntegral(vipPhone) < sum){
            map.put("code", 500);
            map.put("msg", "您的积分不足");
            return map;
        }
        integralExchange.setIntegralTime(new Date()); // 订单生成时间
        List<IntegralExchangeParticulars> iepsList = integralExchange.getIntegralExchangeParticulars(); //订单详情表
        this.integralExchangeMapper.insert(integralExchange); // 返还给我订单号
        Integer integralExchangeId = integralExchange.getId();
        integralExchangeParticularsMapper.insert(integralExchangeId,iepsList);
        merchandiseMapper.updateCutByIds(iepsList);//减少库存数量
        vipMapper.updateCutByIEPhone(integralExchange); //减少会员积分
        map.put("code", 200);
        map.put("msg", "新增订单成功");
        return map;
    }


    // 得到订单详情内商品id
    //根据商品id 查找商品表 兑换所需积分
    // 得到订单详情内 商品兑换数量
    // (商品A数量x积分)+(商品B数量x积分)...=总积分
    /**
     * 通过ID查询单条数据
     *
     * @param integralExchange 实例对象
     * @return 实例对象
     */
 /*   public Map<String, Object> updateById(IntegralExchange integralExchange) {
        this.integralExchangeMapper.updateById(integralExchange);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        return map;
    }*/

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    public Map<String, Object> deleteById(String id) {
        this.integralExchangeMapper.deleteById(id);
        integralExchangeParticularsMapper.deleteById(id);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "成功删除订单");
        return map;
    }
}